//#include<bits/stdc++.h>
//using namespace std;
//int a[10000], b[10000];
//int res[10000];
//int main()
//{
//	int x = 0;
//	cin >> x;
//	int l1 = 0;
//	while (x) {
//		a[l1++] = x % 10;
//		x /= 10;
//	}
//	cin >> x;
//	int l2 = 0;
//	while (x) {
//		b[l2++] = x % 10;
//		x /= 10;
//	}
////	int maxl = l1 > l2 ? l1 : l2;
//	for (int i = 0; i < l2; i++) {
//		for (int j = 0; j < l1 + l2; j++) {
//			res[j + i] += a[j] * b[i];
//		}
//		for (int j = 0; j < l1 + l2; j++) {
//			if (res[j] >= 10) {
//
//				res[j + 1] += res[j] / 10;
//				res[j] %= 10;
//			}
//		}
//	}
//	int l = l1 + l2 - 1;
//	while (res[l] == 0 && l > 0) {
//		l--;
//	}
//	for (int i = l; i >= 0; i--) {
//		cout << res[i];
//	}
//	return 0;
//}
// WA
#include<iostream>
#include<vector>
#include<string>
using namespace std;
struct Wint: vector<int> {
	Wint(int n = 0)
	{
		push_back(n);
		check();
	}
	Wint &check()
	{
		while (!empty() && !back()) {
			pop_back();
		}
		if (empty()) {
			return *this;
		}
		for (int i = 1; i < size(); ++i) {
			(*this) [i] += (*this)[i - 1] / 10;
			(*this)[i - 1] %= 10;
		}
		while (back() >= 10) {
			push_back(back() / 10);
			(*this)[size() - 2] %= 10;
		}
		return *this;
	}
};
istream& operator>>(istream &is, Wint &n)
{
	string s;
	is >> s;
	n.clear();
	for (int i = s.size() - 1; i >= 0; --i) {
		n.push_back(s[i] - '0');
	}
	return is;
}
ostream& operator<<(ostream &os, const Wint &n)
{
	if (n.empty()) {
		os << 0;
	}
	for (int i = n.size() - 1; i >= 0; --i) {
		os << n[i];
	}
	return os;
}
Wint operator*(const Wint &a, const Wint &b)
{
	Wint n;
	n.assign(a.size() + b.size() - 1, 0);
	for (int i = 0; i != a.size(); ++i) {
		for (int j = 0; j != b.size(); ++j) {
			n[i + j] += a[i] * b[j];
		}
	}
	return n.check();
}
int main()
{
	Wint a, b;
	cin >> a >> b;
	cout << a*b;
	return 0;
}
